﻿#pragma once
#include "stdafx1.h"

#include "Source/ProjectModule/Storage/S_StorageManagerTemplate.h"
#include "Source/ProjectModule/Undo/ExtendPart/S_UndoDataContainer.h"
#include "Source/MainModule/Global/S_ConsoleManager.h"

#include "Probe/C_FieldProbe.h"
#include "FieldMonitor/C_FieldMonitor.h"
#include "VoltageMonitor/C_VoltageMonitor.h"
#include "CurrentMonitor/C_CurrentMonitor.h"

/*
-----==========================================================-----
		类：		场强探头模块 - 数据容器.h
		作者：		drill_up
		所属模块：	场强探头模块
		功能：		【数据容器 + 增删改查 + 撤回】
					 （详细见cpp）
-----==========================================================-----
*/

class S_MonitorDataContainer : public QObject, public S_UndoDataContainer, public S_StorageManagerTemplate
{
	Q_OBJECT

	public:
		S_MonitorDataContainer();
		~S_MonitorDataContainer();
		static S_MonitorDataContainer* project_manager;		//单例
		static S_MonitorDataContainer* getInstance();		//单例，获取自己

	//-----------------------------------
	//----数据变化（数组数据）
	public:
	signals :
										//信号 - 某数据 被添加
		void containerDataAdded(C_UndoDataBasePtr ptr, int index);
										//信号 - 某数据 被删除
		void containerDataDeleted(C_UndoDataBasePtr ptr, int index);
										//信号 - 某数据 被修改
		void containerDataModifyed(C_UndoDataBasePtr ptr, int index);
	protected:
										//继承 - 某数据 被添加
		void undoDataAdded(C_UndoDataBasePtr data, int index) override;
										//继承 - 某数据 被修改
		void undoDataModifyed(C_UndoDataBasePtr data, int index) override;
										//继承 - 某数据 被删除
		void undoDataDeleted(C_UndoDataBasePtr data, int index) override;

	//-----------------------------------
	//----数据变化（全局数据）
	public:
	signals :
										//信号 - 存储数据 被读取
		void containerDataAllReloaded();
										//信号 - 某全局数据 被修改
		void containerGlobalDataModifyed(C_UndoDataGlobalBasePtr ptr);
	protected:
										//继承 - 某全局数据 被修改
		void undoDataGlobalModifyed(C_UndoDataGlobalBasePtr data) override;

	//-----------------------------------
	//----消息
	protected:
										//消息 - 输出消息
		void u_showNewMessage(QString message) override;


	//-----------------------------------
	//----添加（数组数据）
	public:
										//添加 - 场监视器
		void add(C_FieldMonitor data);
										//添加 - 场强探头
		void add(C_FieldProbe data);
										//添加 - 电压监视器
		void add(C_VoltageMonitor data);
										//添加 - 电流监视器
		void add(C_CurrentMonitor data);

	//-----------------------------------
	//----修改（数组数据）
	public:
										//修改 - 场监视器
		void modify(C_FieldMonitor data);
										//修改 - 场强探头
		void modify(C_FieldProbe data);
										//修改 - 电压监视器
		void modify(C_VoltageMonitor data);
										//修改 - 电流监视器
		void modify(C_CurrentMonitor data);


	//-----------------------------------
	//----删除
	public:
										//删除 - 删除数据（根据ID）
		void deleteById(QString id);
										//删除 - 删除数据（根据action）
		void deleteByAction();

	//-----------------------------------
	//----复制
	public:
										//复制 - 复制数据（根据ID）
		void copyById(QString id);
										//复制 - 复制数据（根据action）
		void copyByAction();


	//-----------------------------------
	//----获取（数组数据）
	public:
										//获取 - 场强探头
		S_UndoDataContainer_COMMON_DATA_GET_Header(S_MonitorDataContainer, C_FieldProbe, FieldProbe);
										//获取 - 场监视器
		S_UndoDataContainer_COMMON_DATA_GET_Header(S_MonitorDataContainer, C_FieldMonitor, FieldMonitor);
										//获取 - 电压监视器
		S_UndoDataContainer_COMMON_DATA_GET_Header(S_MonitorDataContainer, C_VoltageMonitor, VoltageMonitor);
										//获取 - 电流监视器
		S_UndoDataContainer_COMMON_DATA_GET_Header(S_MonitorDataContainer, C_CurrentMonitor, CurrentMonitor);

		
	//-----------------------------------
	//----获取
	public:
							//获取 - 是否有表面电流设置
		bool hasCurrentSurfaceSetting();



	//-----------------------------------
	//----数据模型的隐藏（场强探头）
	//			（激励源的数据需要能控制显示/隐藏，并且此数据与撤回无关，只临时生效）
	protected:
		QStringList m_dataHideList_Probe;	//隐藏列表（场强探头）
	public slots:
										//数据模型的隐藏 - 设置显示/隐藏（场强探头）
		void setVisible_Probe(QString data_id, bool visible);
		void setAllVisible_Probe(bool visible);
										//数据模型的隐藏 - 指定数据是否显示（场强探头）
		bool isVisible_Probe(QString data_id);
										//数据模型的隐藏 - 获取隐藏列表（场强探头）
										//		【说明】：很多显示/隐藏条件都被叠加在一起，此隐藏列表只是 多个条件 的一种。
		QStringList getHideList_Probe();
	public:
	signals:
										//数据模型的隐藏 - 显示变化信号（场强探头）
										//		【说明】：此功能主要连接 树图标 的功能。
		void signal_VisibleChanged_Probe(QString data_id, bool visible);
		
	//-----------------------------------
	//----数据模型的隐藏（电流监视器）
	//			（激励源的数据需要能控制显示/隐藏，并且此数据与撤回无关，只临时生效）
	protected:
		QStringList m_dataHideList_CurrentMonitor;	//隐藏列表（电流监视器）
	public slots:
										//数据模型的隐藏 - 设置显示/隐藏（电流监视器）
		void setVisible_CurrentMonitor(QString data_id, bool visible);
		void setAllVisible_CurrentMonitor(bool visible);
										//数据模型的隐藏 - 指定数据是否显示（电流监视器）
		bool isVisible_CurrentMonitor(QString data_id);
										//数据模型的隐藏 - 获取隐藏列表（电流监视器）
										//		【说明】：很多显示/隐藏条件都被叠加在一起，此隐藏列表只是 多个条件 的一种。
		QStringList getHideList_CurrentMonitor();
	public:
	signals:
										//数据模型的隐藏 - 显示变化信号（电流监视器）
										//		【说明】：此功能主要连接 树图标 的功能。
		void signal_VisibleChanged_CurrentMonitor(QString data_id, bool visible);
		
	//-----------------------------------
	//----数据模型的隐藏（电压监视器）
	//			（激励源的数据需要能控制显示/隐藏，并且此数据与撤回无关，只临时生效）
	protected:
		QStringList m_dataHideList_VoltageMonitor;	//隐藏列表（电压监视器）
	public slots:
										//数据模型的隐藏 - 设置显示/隐藏（电压监视器）
		void setVisible_VoltageMonitor(QString data_id, bool visible);
		void setAllVisible_VoltageMonitor(bool visible);
										//数据模型的隐藏 - 指定数据是否显示（电压监视器）
		bool isVisible_VoltageMonitor(QString data_id);
										//数据模型的隐藏 - 获取隐藏列表（电压监视器）
										//		【说明】：很多显示/隐藏条件都被叠加在一起，此隐藏列表只是 多个条件 的一种。
		QStringList getHideList_VoltageMonitor();
	public:
	signals:
										//数据模型的隐藏 - 显示变化信号（电压监视器）
										//		【说明】：此功能主要连接 树图标 的功能。
		void signal_VisibleChanged_VoltageMonitor(QString data_id, bool visible);



	//-----------------------------------
	//----存储数据
	protected:
		bool m_block_isAllReloading;	//读取数据阻塞
	protected:
										//数据 - 清除当前管理器数据
		void clearAllData_noSignal();
	public:
										//数据 - 清除当前管理器数据
		void clearAllData() override;
										//数据 - 获取存储的名称
		QString getSaveName() override;
										//数据 - 全部管理器数据 -> QJsonObject
		QJsonObject getAllDataOfJsonObject() override;
										//数据 - QJsonObject -> 全部管理器数据
		void setAllDataFromJsonObject(QJsonObject obj) override;

};

